<?php

class EquipeController extends Controller
{
	/**
	 * @var string the default layout for the views. Defaults to '//layouts/column2', meaning
	 * using two-column layout. See 'protected/views/layouts/column2.php'.
	 */
	public $layout='//layouts/column2';

	/**
	 * @return array action filters
	 */
	public function filters()
	{
		return array(
			'accessControl', // perform access control for CRUD operations
			'postOnly + delete', 
			'postOnly + deleteAssocie', 
		);
	}

	/**
	 * Specifies the access control rules.
	 * This method is used by the 'accessControl' filter.
	 * @return array access control rules
	 */
	public function accessRules()
	{
		return array(
			array('allow',  // allow all users to perform 'index' and 'view' actions
				'actions'=>array('index','view'),
				'users'=>array('*'),
			),
			array('allow', // allow authenticated user to perform 'create' and 'update' actions
				'actions'=>array('create','update','delete','addAssocie', 'addBE', 'addSpecialite', 'autocompleteEntreprise', 'deleteAssocie', 'deleteBureauEtude', 'ajaxObservationEntreprise'),
				'expression'=> 'isset(Yii::app()->user->canEdit) && Yii::app()->user->canEdit',
			),
			array('allow', // allow admin user to perform 'admin' and 'delete' actions
				'actions'=>array('admin','delete'),
				'users'=>array('admin'),
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

	/**
	 * Displays a particular model.
	 * @param integer $id the ID of the model to be displayed
	 */
	public function actionView($id)
	{
		$this->render('view',array(
			'model'=>$this->loadModel($id),
		));
	}

	/**
	 * Creates a new model.
	 * If creation is successful, the browser will be redirected to the 'view' page.
	 * @param integer $id identifiant du tableau architecte auquel appartient l'équipe
	 */
	public function actionCreate($id)
	{
		$model=new Equipe;

		$model->idTableauArchitecte = $id;

		// Uncomment the following line if AJAX validation is needed
		// $this->performAjaxValidation($model);

		if(isset($_POST['Equipe']))
		{
			$model->attributes=$_POST['Equipe'];
			
			if($model->save()) {
			
				// on enregistre les sociétés ajoutées par ajax
				if( isset($_POST['EquipeHasAssocie']) ) {
					foreach( $_POST['EquipeHasAssocie'] as $eha ) {
						$equipeHasAssocie = new EquipeHasAssocie( $model->idEquipe, $eha['idEntreprise'], $eha['observation'] );
						$equipeHasAssocie->attestationArchitecte = $equipeHasAssocie['attestationArchitecte'] == "1";
						$equipeHasAssocie->isNewRecord = true;
						$equipeHasAssocie->save();
					}
				}
			
				// on test si l'équipe a des bureaux d'études
				if( !empty($_POST['EquipeHasBureauetude']) ) {
								
					// on parcourt les associations envoyées par POST
					foreach ( $_POST['EquipeHasBureauetude'] as $index => $equipeHasBE) {
						// on créer l'objet
						$ehs = new EquipeHasBureauetude($model->idEquipe, $equipeHasBE['idEntreprise']);
						$ehs->DC1 = $equipeHasBE['DC1'] == '1';
						$ehs->DC2 = $equipeHasBE['DC2'] == '1';
						// on le définit comme nouvel enregistrement
						$ehs->isNewRecord = true;
						// on le sauvegarde
						$ehs->save();
						// on test si l'objet à des corps d'état
						if( isset($_POST['BureauetudeHasSpecialite'][$index]) ) {
							// on parcourt l'array obtenue
							foreach( $_POST['BureauetudeHasSpecialite'][$index] as $beHSp ) {
								// on test si le cors d'état est défini
								if( !empty($beHSp['idSpecialite']) ) {
									// on crée l'association
									$beHSp = new BureauetudeHasSpecialite($model->idEquipe, $equipeHasBureauetude['idEntreprise'], $beHSp['idSpecialite']);
									// on supprime (pour éviter les doublons)
									$beHSp->delete();
									// on le définit comme nouvel enregistrement
									$beHSp->isNewRecord = true;
									// on sauvegarde
									$beHSp->save();
								}
							}
						}
					}
				}
				
				$this->redirect(array('tableauArchitecte/view','id'=>$model->idTableauArchitecte));
			}
		}

		$this->render('create',array(
			'model'=>$model,
			'tableauArchitecte' => TableauArchitecte::model()->findByPk( $model->idTableauArchitecte )
		));
	}

	/**
	 * Updates a particular model.
	 * If update is successful, the browser will be redirected to the 'view' page.
	 * @param integer $id the ID of the model to be updated
	 */
	public function actionUpdate($id)
	{
		$model=$this->loadModel($id);
		
		if(isset($_POST['Equipe']))
		{ //die( var_dump($_POST) );
			$model->attributes=$_POST['Equipe'];
			
			if($model->save()) {
				// on test si l'equipe a des associés
				if( !empty($_POST['EquipeHasAssocie']) ) {
				
					// on supprime les associés déjà présents dans la base
					EquipeHasAssocie::model()->deleteAllByAttributes( array('idEquipe' => $id) );
				
					// on parcourt les associés envoyés par POST
					foreach ( $_POST['EquipeHasAssocie'] as $equipeHasAssocie ) {
						// on crée notre objet
						$eha = new EquipeHasAssocie( $model->idEquipe, $equipeHasAssocie['idEntreprise'], $equipeHasAssocie['observation'] );
						// on définit si l'associe à l'attestation ou non
						$eha->attestationArchitecte = $equipeHasAssocie['attestationArchitecte'] == "1";
						// on supprime pour éviter les doublons
						$eha->delete();
						// on le définit comme nouvel enregistrement
						$eha->isNewRecord = true;
						// on sauvegarde
						$eha->save();
					}
				}
					
				// on test si l'équipe a des bureaux d'études
				if( !empty($_POST['EquipeHasBureauetude']) ) {
				
					// on récupère les associations existantes
					$ehss = EquipeHasBureauetude::model()->findAllByAttributes( array('idEquipe' => $id) );
				
					// on parcourt les associations obtenues
					foreach( $ehss as $ehs ) {
						// on supprimes les corps d'étas liés à l'association
						BureauetudeHasSpecialite::model()->deleteAllByAttributes( array('idEquipe' => $id, 'idEntreprise' => $ehs->idEntreprise) );
						// on supprime l'association
						$ehs->delete();
					}
				
					// on parcourt les associations envoyées par POST
					foreach ( $_POST['EquipeHasBureauetude'] as $index => $equipeHasBureauetude ) {
						// on créer l'objet
						$ehbe = new EquipeHasBureauetude($model->idEquipe, $equipeHasBureauetude['idEntreprise']);
						$ehbe->DC1 = $equipeHasBureauetude['DC1'] == '1';
						$ehbe->DC2 = $equipeHasBureauetude['DC2'] == '1';
						// on le définit comme nouvel enregistrement
						$ehbe->isNewRecord = true;
						// on le sauvegarde
						$ehbe->save();
						
						// on test si l'objet à des spécialités
						if( isset($_POST['BureauetudeHasSpecialite'][$index]) ) {
							// on parcourt l'array obtenue
							foreach( $_POST['BureauetudeHasSpecialite'][$index] as $beHSp ) {
								// on test si la spécialité est défini
								if( !empty($beHSp['idSpecialite']) ) {
									// on crée l'association
									$beHSp = new BureauetudeHasSpecialite($model->idEquipe, $equipeHasBureauetude['idEntreprise'], $beHSp['idSpecialite']);
									// on supprime (pour éviter les doublons)
									$beHSp->delete();
									// on le définit comme nouvel enregistrement
									$beHSp->isNewRecord = true;
									// on sauvegarde
									$beHSp->save();
								}
							}
						}
					}
				}
				$this->redirect(array('tableauArchitecte/view','id'=>$model->idTableauArchitecte));
			}
		}

		$this->render('update',array(
			'model'=>$model,
			'associes' => EquipeHasAssocie::model()->findAllByAttributes( array('idEquipe' => $id) ),
			'bureaux' => EquipeHasBureauetude::model()->findAllByAttributes( array('idEquipe' => $id) ),
			'tableauArchitecte' => TableauArchitecte::model()->findByPk( $model->idTableauArchitecte )
		));
	}

	/**
	 * Deletes a particular model.
	 * If deletion is successful, the browser will be redirected to the 'admin' page.
	 * @param integer $id the ID of the model to be deleted
	 */
	public function actionDelete($id,$tableau)
	{
		
                EquipeHasAssocie::model()->deleteAllByAttributes( array('idEquipe' => $id) );
                BureauetudeHasSpecialite::model()->deleteAllByAttributes( array('idEquipe' => $id) );
                EquipeHasBureauetude::model()->deleteAllByAttributes( array('idEquipe' => $id));
                $this->loadModel($id)->delete();
		
               // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
                if(!isset($_GET['ajax']))
			$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('tableauArchitecte/view/'.$tableau));
	}
	
	public function actionDeleteAssocie( $idAssocie, $idEquipe ) {
		EquipeHasAssocie::model()->findByPk( array('idEntreprise' => $idAssocie, 'idEquipe' => $idEquipe))->delete();
	}
	
	public function actionDeleteBureauEtude( $idEntreprise, $idEquipe ) {
		BureauetudeHasSpecialite::model()->deleteAllByAttributes( array('idEquipe' => $idEquipe, 'idEntreprise' => $idEntreprise));
		EquipeHasBureauetude::model()->deleteByPk( array('idEquipe' => $idEquipe, 'idEntreprise' => $idEntreprise));
	}

	/**
	 * Lists all models.
	 */
	public function actionIndex()
	{
		$dataProvider=new CActiveDataProvider('Equipe');
		$this->render('index',array(
			'dataProvider'=>$dataProvider,
		));
	}

	/**
	 * Manages all models.
	 */
	public function actionAdmin()
	{
		$model=new Equipe('search');
		$model->unsetAttributes();  // clear any default values
		if(isset($_GET['Equipe']))
			$model->attributes=$_GET['Equipe'];

		$this->render('admin',array(
			'model'=>$model,
		));
	}

	/**
	 * Returns the data model based on the primary key given in the GET variable.
	 * If the data model is not found, an HTTP exception will be raised.
	 * @param integer $id the ID of the model to be loaded
	 * @return Equipe the loaded model
	 * @throws CHttpException
	 */
	public function loadModel($id)
	{
		$model=Equipe::model()->findByPk($id);
		if($model===null)
			throw new CHttpException(404,'The requested page does not exist.');
		return $model;
	}

	/**
	 * Performs the AJAX validation.
	 * @param Equipe $model the model to be validated
	 */
	protected function performAjaxValidation($model)
	{
		if(isset($_POST['ajax']) && $_POST['ajax']==='equipe-form')
		{
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
	}

	/**
	 * Fonction appellée par ajax (equipe/_form)
	 * @param integer $nbAssocies nombre d'associés déjà présents
	 */
	public function actionAddAssocie( $nbAssocies ) {
		// on crée un model vide
		$model = new EquipeHasAssocie();
		
		// div utile lorsque l'on compte le nombre d'associés présents
		$html = "<tr id='associe$nbAssocies'>";
		
		// on ajoute une icone pour supprimer l'enregistrement
		$html .= '<td>';
		$html .= CHtml::link('<span class="icon-trash"></span>', '#', array('id' => 'deleteAssocie'.$nbAssocies));
		// on ajoute le javascript en dur (sinon il n'est pas envoyé au client, les fonctions envoient le JS au chargement de la page)
		$html .= '<script type="text/javascript">';
		$html .= "jQuery('body').on(
			'click',
			'#deleteAssocie$nbAssocies',
			function(){
				if(confirm('Êtes vous sûr ?')) {
					jQuery.ajax({
						'type':'POST',
						'success': function(){
							$('#associe$nbAssocies').remove()
						;},
						'url':'".Yii::app()->baseUrl."/equipe/deleteAssocie?idAssocie=null&idEquipe=null',
						'cache':false,
						'data':jQuery(this).parents('form').serialize()
					});
					return false;
				} 
			else return false;
		});";
		$html .= '</script>';
		
		$html .= '</td>';
		
		$html .= '<td>';
		
		// input servant à l'autocomplete
		$html .= CHtml::textField("autoCompleteAssocie$nbAssocies", '', array(
			'autocomplete' => 'off',
			'id' => "autoCompleteAssocie$nbAssocies",
			'class' => 'ui-autocomplete-input'
		));
		
		// on ajoute le script JQuerui de l'autocomplete
		$html .= '<script type="text/javascript">';
		$html .= "jQuery('#autoCompleteAssocie".$nbAssocies."').autocomplete({'empty':function(event, ui) {
					$('#EquipeHasAssocie_".$nbAssocies."_idEntreprise').empty();
				}, 
				'select':function(event, ui) {
					$('#EquipeHasAssocie_".$nbAssocies."_idEntreprise').val( ui.item. id );
				},
				'source':'".Yii::app()->baseUrl."/equipe/autocompleteEntreprise'});
			;";
		$html .= '</script>';
		
		// on ajoute un input caché (pour y insérer l'ID de l'entreprise selectionnée)
		$html .= CActiveForm::hiddenField($model, "[$nbAssocies]idEntreprise");
		
		$html .= '</td>';
		
		$html .= '<td>'. CActiveForm::checkBox($model, "[$nbAssocies]attestationArchitecte") .'</td>';
		
		// on ajoute un textArea pour une observation
		$html .= '<td>'. CActiveForm::textArea($model, "[$nbAssocies]observation") .'</td>';
		
		$html .= '</tr>';
		
		echo $html;
	}
	
	/**
	 * Fonction appellée par ajax (equipe/_form)
	 * Ajoute un bureau d'étude pour l'équipe
	 * @param integer $nbBE nombre de bureaux d'études déjà présents
	 */
	public function actionAddBE ( $nbBE ) {
		// on crée un nouvel objet vide
		$model = new EquipeHasBureauetude();
		
		// on crée une div
		$html = '<tr class="bureau'.$nbBE.'">';
		
		// on ajoute une icone pour supprimer l'enregistrement
		$html .='<td>';
		$html .= CHtml::link('<span class="icon-trash"></span>', '#', array('id' => 'deleteBureauEtude'.$nbBE));
		// on ajoute le javascript en dur (sinon il n'est pas envoyé au client, les fonctions envoient le JS au chargement de la page)
		$html .= '<script type="text/javascript">';
		$html .= "jQuery('body').on(
			'click',
			'#deleteBureauEtude$nbBE',
			function(){
				if(confirm('Êtes vous sûr ?')) {
					jQuery.ajax({
						'type':'POST',
						'success': function(){
							$('.bureau$nbBE').remove()
						;},
						'url':'".Yii::app()->baseUrl."/equipe/deleteBureauEtude?idEntreprise=null&idEquipe=null',
						'cache':false,
						'data':jQuery(this).parents('form').serialize()
					});
					return false;
				} 
			else return false;
		});";
		$html .= '</script>';
		$html .= '</td>';
		
		$html .= '<td>';
		// input servant à l'autocomplete
		$html .= CHtml::textField("autoCompleteBureauEtude$nbBE", '', array(
			'autocomplete' => 'off',
			'id' => "autoCompleteBureauEtude$nbBE",
			'class' => 'ui-autocomplete-input'
		));
		
		// on ajoute le script JQuerui de l'autocomplete
		$html .= '<script type="text/javascript">';
		$html .= "jQuery('#autoCompleteBureauEtude".$nbBE."').autocomplete({'empty':function(event, ui) {
					$('#EquipeHasBureauetude[".$nbBE."]idEntreprise').empty();
				},
				'select':function(event, ui) {
					console.log( ui.item.id );
					$('#EquipeHasBureauetude_".$nbBE."_idEntreprise').val( ui.item.id );
				},
				'source':'".Yii::app()->baseUrl."/equipe/autocompleteEntreprise'});
			;";
		$html .= '</script>';
		$html .='</td>';
		
		// on ajoute un input caché (pour y insérer l'ID de l'entreprise selectionnée)
		$html .= CHtml::hiddenField("EquipeHasBureauetude[". $nbBE ."][idEntreprise]", '', array('id' => "EquipeHasBureauetude_".$nbBE."_idEntreprise"));
		
		// on ajoute les CB de DC1 et DC2
		$html .= '<td>'. CHtml::checkBox("EquipeHasBureauetude[". $nbBE ."][DC1]") .'</td>';
		$html .= '<td>'. CHtml::checkBox("EquipeHasBureauetude[". $nbBE ."][DC2]") .'</td>';
		
		// on ajoute un bouton par ajouter (via ajax) des DDL
		$html .= '<td>'.CHtml::button( 'Spécialité', array('onclick' => 'addSpecialite('.$nbBE.')', 'class' => 'btn') ).'</td>';
		
		// on ajoute une div vide qui contiendra les DDL des corps d'état
		$html .= '<tr class="bureau'.$nbBE.'"><td  class="corpsEtat" colspan="5" style="text-align: left"></td></tr>';
		
		// on ferme la div
		$html .= '</tr>';
		
		// on affiche notre html
		echo $html;
	}
	
	/**
	 * Fonction appellée par ajax (equipe/_form)
	 * Ajoute un corps d'état pour le bureau d'étude
	 * @param integer $index position du bureau d'étude (pour la soumission de l'array par $_POST)
	 * @param integer $nbCE nombre de spécialités déjà présents
	 */
	public function actionAddSpecialite ( $index, $nbCE ) {
		// on crée une nouvelle liaison vide
		$model = new BureauetudeHasSpecialite();
		
		// on ajoute une DDL avec les corps d'état
		$html = CHtml::dropDownList("BureauetudeHasSpecialite[". $index ."][". $nbCE ."][idSpecialite]", "libelle",
						CHtml::listData(Specialite::model()->findAll(array('order' => 'libelle')), 'idSpecialite', 'libelle'),array('empty' => '','style'=>'width: auto'));
		// on affiche notre html
		echo $html;
	}
	
	/**
	 * Permet l'autocomplétion via ajax
	 */
	public function actionAutocompleteEntreprise () {
		// On exécute si l'utilisateur a effectué une saisie
		if( isset($_GET['term'])) {
			// on recherche les models correspondants à la saisie
			$models = Entreprise::model()->findAll(array(
					'condition' => "nom LIKE :nom",
					'limit' => 10,
					'params' => array(':nom' => '%'.$_GET['term'].'%')
			));
			
			// on récupère les données
			foreach( $models as $model ) {
				$result[] = array (
						'label' => $model->nom,
						'value' => $model->nom,
						'id' => $model->idEntreprise,
				);
			}
			// on les affiche
			echo CJSON::encode($result);
		}
	
		Yii::app()->end();
	}

	public function actionAjaxObservationEntreprise ( $ids ) {
		$html = '';
		foreach ( explode(',', $ids) as $id ) { 
			$html .= Entreprise::model()->findByPk( $id, array('select' => 'observation') )->observation ."\n";
		}
		echo $html;
	}

	
}
